package com.code.test.dance;

/**
 * https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html
 * 236. 二叉树的最近公共祖先
 * 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
 * <p>
 * 百度百科中最近公共祖先的定义为：“对于有根树 T 的两个结点 p、q，最近公共祖先表示为一个结点 x，满足 x 是 p、q 的祖先且 x 的深度尽可能大（一个节点也可以是它自己的祖先）。”
 * <p>
 * 例如，给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]
 *
 * https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
 */
public class CodeZuijinZuxian {

    public static void main(String[] args) {

    }

    public static TreeNode lowestCommonAncestor(TreeNode node, TreeNode p, TreeNode q) {
        if (node == null) {
            return null;
        }
        if (node == p || node == q) {
            return node;
        }
        TreeNode left = lowestCommonAncestor(node.left, p, q);
        TreeNode right = lowestCommonAncestor(node.right, p, q);
        //如果左右节点都找到了，即node是公共祖先
        if (left != null && right != null) {
            return node;
        } else if (left == null && right != null) {
            //如果左树没有，右树有，则返回右子树
            return right;
        } else if (left != null && right == null) {
            //如果左树有，右树没有，则返回左子树
            return left;
        } else {
            //都没找到
            return null;
        }
    }

}
